﻿#pragma once


#include <QStack>

//这个类主要用于处理数据，然后配合controller以及calculate，分离一下职责，支持普通输入、负数处理、组合操作、撤销与重做等
class ExpressionBuffer {
public:

    ExpressionBuffer() {};

    ~ExpressionBuffer() {};

    //添加一个 token（如数字、+、- 等）
    void append(const QString& token);

    //将当前表达式包裹为 1/(...)
    void wrapWithInverse();

    //将当前表达式包裹为 -(...)
    void wrapWithNegate();

    //撤销上一步操作（支持多级）
    void undo();

    //重做上一次撤销的操作
    void redo();

    //清空表达式及操作历史
    void clear();

    //清空操作历史记录（不清除当前表达式）
    void clearProcess();

    //返回表达式完整字符串
    QString toString() const;

    //返回用于 UI 显示的表达式（带可视化符号）
    QString toDisplayString() const;

    //判断当前表达式是否为空
    bool isEmpty() const;

    //记录当前表达式进历史栈（用于撤销）
    void pushProcess();

    //返回当前未闭合的负号计数
    int getMinusCount();

    //重置负号状态
    void clearMinus();

    //判断是否是二元运算符
    bool isBinaryOperator(const QString& token) const;

    //判断是否为数字
    bool isNumber(const QString& token) const;

private:
    //处理带负号的特殊输入逻辑
    bool minusAppend(const QString& token);

    //清除 redo 栈（新操作后调用）
    void clearRedoStack();

private:
    //当前表达式token栈
    QStack<QString> m_tokens;

    //操作历史栈（用于多级撤销）
    QStack<QStack<QString>> m_processStack;

    //redo用栈
    QStack<QStack<QString>> m_redoStack;

    //未闭合负号数量（用于自动补括号）
    int m_minusCount = 0;
};


